Custom Global Inputs — WARIO 1.0.0 documentation

# Custom Global Inputs

Global variables are able to be input into WARIO in multiple ways but on occasion it is necessary for a more complex input interface to be used. In these cases, custom interfaces based on the `GlobalWindowWidget` class in `extensions.globalWidgets` can be used.

## Building A Custom Interface

All classes that are to be used as global variable interfaces must inheret the `GlobalWindowWidget` class. The following is a guide on how to correctly set up a custom interface

### 1 - Initialization

As with the settings window, the class must be initialized. The `GlobalWindowWidget` class has no initialization parameters so this is a simple process.

    from extensions.globalWidgets import GlobalWindowWidget

    class ExampleGlobalWidget(GlobalWidgetWindow):
        def __init__(self):
            super(ExampleGlobalWidget, self).__init__()

### 2 - Building your interface

The interface for the widget can be built in the same way as described in step 2 of the Custom Settings Guide. The key difference is that in this case, the interface must be built in the `__init__` function.

The parent class contains a pre-made `QHBoxLayout` layout assigned to the `self.layout` variable. This has a reduced margin that makes sure that the interface is not placed too close to the window margins. This can be overloaded if necessary.

        self.textbox = QtWidgets.QLineEdit()
        self.layout.addWidget(self.textbox)

This gives a final initialization function of

    from extensions.globalWidgets import GlobalWindowWidget
    from PyQt5 import QtWidgets

    class ExampleGlobalWidget(GlobalWidgetWindow):
        def __init__(self):
            super(ExampleGlobalWidget, self).__init__()
            self.textbox = QtWidgets.QLineEdit()
            self.layout.addWidget(self.textbox)

### 3 - Setting up the data collection function

The values of the global variables is gathered by looping over each row in the table and calling the `getData` function. This returns an object or variable that contains all the data required by the code to use that global variable

    def getData(self):
        return self.texbox.text()

### 4 - Setting up the interface loading function

When a file is loaded, the global variable interface loops through each row and calls the `setData` function, passing the dict containing all the information on that row’s global variable. This is used to initialize the data within that interface. The data given by the `getData` function is stored under the key “value”.

    def setData(self, gb):
        self.textbox.setText(gb["value"])

### Finished Custom Global Widget

    from extensions.globalWidgets import GlobalWindowWidget
    from PyQt5 import QtWidgets

    class ExampleGlobalWidget(GlobalWidgetWindow):
        def __init__(self):
            super(ExampleGlobalWidget, self).__init__()
            self.textbox = QtWidgets.QLineEdit()
            self.layout.addWidget(self.textbox)

        def getData(self):
            return self.texbox.text()

        def setData(self, gb):
            self.textbox.setText(gb["value"])

## Complex interfaces

More complex interfaces may require more data to initialize than is used by the code to operate on the global variables. When this is the case, we can define additional properties through the `getProperties` function. These properties are stored in the “properties” key in the global variable’s dict and can be access in the `setData` function.

To use this function, return a dict containing any relevant data. Be aware that this function is called when a new instance of the interface is created and therefore the list of properties must be checked to make sure they contain the relevant keys.

        def getProperties(self):
            tabID = self.tabs.currentIndex()
            mode = self.modeCombo.currentIndex()

            return {"tabID" : tabID, "mode" : mode}

        def setData(self, gb):
            if "tabID" in gb["properties"].keys():
                self.tabs.setCurrentIndex(gb["properties"]["tabID"])
            if "mode" in gb["properties"].keys():
                self.modeCombo.setCurrentIndex(gb["properties"]["mode"])

Note that this also requires `"properties" : {}` to be added to the global variable’s JSON data when creating a custom toolkit.